// 配置路由
import Vue from 'vue'
import VueRouter from 'vue-router'

// 引入路由配置信息
import routes from './routes'
import store from '@/store'
// 先把原型对象上的push方法进行保存
let originPush = VueRouter.prototype.push
let originReplace = VueRouter.prototype.replace
//VueRouter.prototype原型对象添加一个方法
//location:路由跳转相关的信息
VueRouter.prototype.push = function (location, resolve, reject) {
  //当前函数this：即为VueRouter类的实例
  //相当于push方法里面this，是windows【完犊子了】
  //利用人家push方法实现路由跳转，保证push里面this,应该vueRouter类的实例

  //面试:函数apply与call区别?
  //相同的地方:都可以篡改函数里面this
  //不同的地方:apply传递参数 数组  call传递参数 逗号分割

  if (resolve && reject) {
    //代表真:代表着两个形参接受参数【箭头函数】
    originPush.call(this, location, resolve, reject)
  } else {
    originPush.call(
      this,
      location,
      () => {},
      () => {}
    )
  }
}
VueRouter.prototype.replace = function (location, resolve, reject) {
  if (resolve && reject) {
    //代表真:代表着两个形参接受参数【箭头函数】
    originReplace.call(this, location, resolve, reject)
  } else {
    originReplace.call(
      this,
      location,
      () => {},
      () => {}
    )
  }
}

// 使用插件
Vue.use(VueRouter)
// 对外暴露的VueRouter实例
let router = new VueRouter({
  // mode:hash,
  // 配置路由
  routes,
  //设置滚动条的位置
  scrollBehavior() {
    //滚动行为这个函数,需要有返回值,返回值为一个对象。
    //经常可以设置滚动条x|y位置 [x|y数值的设置一般最小是零]
    return { y: 0 }
  }
})
export default router

// 注册路由全局前置守卫：(在路由跳转之间进行判断)
router.beforeEach(async (to, from, next) => {
  const { token } = store.state.user
  const { nickName } = store.state.user.userInfo
  // 判断
  if (token) {
    if (to.path == '/login' || to.path == '/register') {
      next('/home') // home页可以不需要用户信息展示
    } else {
      if (nickName) {
        next() // 有用户信息可以去任意的页面
      } else {
        // 登录了，有token,但没有用户信息,去的也不是home页
        try {
          await store.dispatch('user/getUserInfo')
          next()
        } catch (error) {
          //用户没有信息，还携带token发请求获取用户信息【失败】
          //token【学生证失效了】
          //token失效:本地清空数据、服务器的token通知服务器清除
          await store.dispatch('user/userLogout')
          //回到登录页，重新获取一个新的学生证
          next('/login')
        }
      }
    }
  } else {
    // 解决无限循环的测试
    // console.log('没有token总的')
    // if (to.path == '/login') {
    //   console.log('没有token--来登录页')
    //   next()
    // } else {
    //   console.log('没有token--还去的不是登录页？')
    //   next('/login')
    // }

    //用户未登录||目前的判断都是放行.将来这里会'回手掏'增加一些判断
    //用户未登录:不能进入/trade、/pay、/paysuccess、/center、/center/myorder  /center/teamorder
    let toPath = to.path
    // 如果未登录，并且是访问不能进入的页面，跳转到登录页并携带回调地址
    if (
      toPath.indexOf('trade') != -1 ||
      toPath.indexOf('pay') != -1 ||
      toPath.indexOf('center') != -1
    ) {
      next('/login?redirect=' + toPath)
    } else {
      next()
    }
  }
})
